#ifndef IMAGE_HPP
#define IMAGE_HPP

#include <string>
#include "Resource.hpp"

namespace gdl
{
  class ImageImpl;

  ////////////////////////////////////////////////////////////
  /// The Image class provides image loading and image
  /// binding.
  ////////////////////////////////////////////////////////////
  class	Image : private Resource<ImageImpl>
  {
  public:
    ////////////////////////////////////////////////////////////
    /// Default constructor.
    ////////////////////////////////////////////////////////////
    Image(void);

    ////////////////////////////////////////////////////////////
    /// Default destructor.
    ////////////////////////////////////////////////////////////
    ~Image(void);

    ////////////////////////////////////////////////////////////
    /// Load an image from a file.
    ///
    /// \param[in] filename Filename of the image with extension.
    /// \return An instance of the resource.
    ////////////////////////////////////////////////////////////
    static Image		load(std::string const & filename);

    ////////////////////////////////////////////////////////////
    /// Bind the texture on the GPU.
    ////////////////////////////////////////////////////////////
    void			bind(void);

    ////////////////////////////////////////////////////////////
    /// Get the width of the image.
    ///
    /// \return Width of the image.
    ////////////////////////////////////////////////////////////
    unsigned int		getWidth(void) const;

    ////////////////////////////////////////////////////////////
    /// Get the height of the image.
    ///
    /// \return Height of the image.
    ////////////////////////////////////////////////////////////
    unsigned int		getHeight(void) const;

    ////////////////////////////////////////////////////////////
    /// Get a pointer to the pixel array of the image.
    ///
    /// \return Pointer to the pixel array.
    ////////////////////////////////////////////////////////////
    unsigned char const*	getPixelPtr(void) const;

    using Resource<ImageImpl>::isValid;

  private:
    ////////////////////////////////////////////////////////////
    /// Explicit constructor.
    ///
    /// \param impl Pointer on ImageImpl.
    ////////////////////////////////////////////////////////////
    explicit Image(ImageImpl* impl);

    ////////////////////////////////////////////////////////////
    /// Image implementation.
    ////////////////////////////////////////////////////////////
    friend class ImageImpl;
  };
}

#endif /* IMAGE_HPP */
